﻿using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using CRUD.InterfaceDAO;
using CapaNegocios;
using GestionadorBaseDatos;
using CapaGestion.Spring;
using Twitterizer.Framework;

namespace CapaGestion
{
    /// <summary>
    /// Gestiona los eventos del sistema
    /// </summary>
    public class GestionarEvento : IGestionEvento
    {
        private IDaoEvento daoEvento;
        private IDaoCategoria daoCategoria;
        private IDaoParticipante daoParticipante;
        private IDaoProporcion daoProporcion;
        private IList eventoDevuelto = new ArrayList();
        private IList apuestaDevuelta = new ArrayList();

        /// <summary>
        /// metodo para insertar un evento en la bd
        /// </summary>
        /// <param name="crearEvento">objeto con la informacion del objeto a crear</param>
        public void Insert(Evento crearEvento)
        {
            daoEvento.Insert(crearEvento);
        }

        /// <summary>
        /// metodo para obtener todos los eventos en el sistema
        /// </summary>
        /// <returns>lista con los procedimientos</returns>
        public IList GetAll()
        {
            return insertarCategoria(daoEvento.GetAll());
        }

        /// <summary>
        /// metodo para obtener una lista de eventos dado un dia
        /// </summary>
        /// <param name="e">objeto con la informacion necesaria para la busqueda</param>
        /// <returns>lista con eventoss</returns>
        public IList GetByDia(Evento e)
        {
            return insertarCategoria(daoEvento.GetByDia(e));
        }

        /// <summary>
        /// obtiene un evento dado su id
        /// </summary>
        /// <param name="idEvento">id que representa el evento a buscar</param>
        /// <returns>evento</returns>
        public Evento GetById(int idEvento)
        {
            return insertarCatEven(daoEvento.GetById(idEvento));
        }

        /// <summary>
        /// obtiene una lista de eventos segun una categoria
        /// </summary>
        /// <param name="idCategoria">idcategoria para la busqueda</param>
        /// <returns>lista eventos</returns>
        public IList GetByCategoria(int idCategoria)
        {
            return insertarCategoria(daoEvento.GetByCategoria(idCategoria));
        }

        /// <summary>
        /// obtiene un evento segun la fecha
        /// </summary>
        /// <returns>lista eventos</returns>
        public IList GetEventoFecha()
        {
            return (insertarCategoria(daoEvento.GetEventoFecha()));
        }

        /// <summary>
        /// procedimiento completa los objetos de un evento dentro de unalista
        /// </summary>
        /// <param name="agregarDatos">recibe una lista casi vacia para completarla</param>
        /// <returns>lista de eventos con todos su datos</returns>
        public IList insertarCategoria(IList agregarDatos)
        {
            int numeroCampos = agregarDatos.Count;
            for (int i = 0; i < numeroCampos; i++)
            {
                Evento agregarCategoria = (Evento)agregarDatos[i];
                agregarCategoria.Proporciones = daoProporcion.GetByEvento(agregarCategoria.IdEvento);
                foreach (Proporcion p in agregarCategoria.Proporciones)
                {
                    p.Participante = daoParticipante.GetById(p.Participante.IdParticipante);
                }
                agregarCategoria.CategoriaAsociada = daoCategoria.GetById(agregarCategoria.CategoriaAsociada);
                eventoDevuelto.Add(agregarCategoria);
            }
            return eventoDevuelto;
        }

        /// <summary>
        /// procedimiento completa los objetos de un evento
        /// </summary>
        /// <param name="agregarDato">evento con datos</param>
        /// <returns>evento con todos sus datos</returns>
        public Evento insertarCatEven(Evento agregarDato)
        {
            agregarDato.Proporciones = daoProporcion.GetByEvento(agregarDato.IdEvento);
            foreach (Proporcion p in agregarDato.Proporciones)
            {
                p.Participante = daoParticipante.GetById(p.Participante.IdParticipante);
            }
            agregarDato.CategoriaAsociada = daoCategoria.GetById(agregarDato.CategoriaAsociada);
            return agregarDato;
        }

        /// <summary>
        /// obtiene todas las categorias
        /// </summary>
        /// <returns>lista de categorias en el sistema</returns>
        public IList categorias()
        {
            IList agregarDatos = daoCategoria.GetAll();
            IList eventosDevueltos = new ArrayList();
            int numeroCampos = agregarDatos.Count;
            for (int i = 0; i < numeroCampos; i++)
            {
                Categoria agregar = (Categoria)agregarDatos[i];
                agregar.ListaEventos = daoEvento.GetByCategoria(agregar.IdCategoria);
                agregar.ListaParticipantes = daoParticipante.GetByCategoria(agregar.IdCategoria);
                eventosDevueltos.Add(agregar);
            }
            return eventosDevueltos;
        }

        /// <summary>
        /// procedieminto para insertar un objeto proporcion
        /// </summary>
        /// <param name="propo">objeto a insertar</param>
        public void insertarProporcion(Proporcion propo)
        {
            daoProporcion.Insert(propo);
        }

        /// <summary>
        /// obtiene una categoria dado su id
        /// </summary>
        /// <param name="cat">categoria que representa el id</param>
        /// <returns>categoria con datos completos</returns>
        public Categoria categoriaId(Categoria cat)
        {
            Categoria agregarDato = daoCategoria.GetById(cat);
            agregarDato.ListaEventos = daoEvento.GetByCategoria(agregarDato.IdCategoria);
            agregarDato.ListaParticipantes = daoParticipante.GetByCategoria(agregarDato.IdCategoria);
            return agregarDato;
        }

        /// <summary>
        /// metodo que busca un participante dado su id
        /// </summary>
        /// <param name="p">participante a buscar</param>
        /// <returns></returns>
        public Participante GetParticipante(Participante p)
        {
            return daoParticipante.GetById(p.IdParticipante);
        }

        /// <summary>
        /// metodo para updatear un evento
        /// </summary>
        /// <param name="e">evento con los datos a updatear</param>
        public void Update(Evento e)
        {
            daoEvento.Update(e);
        }

        /// <summary>
        /// metodo para updatear una proporcion
        /// </summary>
        /// <param name="p">objeto proporcion con datos a updatear</param>
        public void UpdateProporcion(Proporcion p)
        {
            daoProporcion.Update(p);
        }

        /// <summary>
        /// Metodo usado para postear el ganador de un evento en el twitter
        /// </summary>
        public void PostearTweet(Proporcion proporcion)
        {
            Twitter tweet = new Twitter("kamalde", "barroeta");

            string mensaje = "En el Evento " + proporcion.EventoAsociado.NombreEvento + ", de la fecha "
                            + proporcion.EventoAsociado.FechaEvento.ToShortDateString() + ", el ganador fue "
                            + proporcion.Participante.Nombre;

            tweet.Status.Update(mensaje);
        }
    }
}
